home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Examples / eyes / audreye5.wwModel / animationProcs.eve next >
Encoding:
Text File  |  1995-03-22  |  15.0 KB  |  450 lines

  1. set blink(agentName) "blinkAgent"
  2. set blink(agentWeight) 1
  3. set blink(howManySeconds) 1
  4. set blink(thetaMin) 190; # need to use this...
  5. set blink(thetaMax) 360
  6. set blink(downU) .4
  7. set blink(upU) .6
  8.  
  9. proc preBlink {} {  global  scene blink sphere
  10.  
  11.   set blink(howManySteps) [expr {$blink(howManySeconds) * $scene(ticksPerSecond)}]
  12.   set blink(uIncr)  [expr 1.0/[expr {$blink(howManySteps) - 1}]]
  13.   set blink(initialTheta) $sphere(thetaMax)
  14.   set blink(u) 0
  15.  
  16.   registerSampleGenerator $blink(agentName) $blink(agentWeight)
  17.   sampleGeneratorIsExecuting $blink(agentName) 1
  18.  
  19.   synchWithScene
  20.   return
  21. }
  22.  
  23.  
  24. proc blinkMotorProgram {u pauseStart pauseStop initialTheta thetaMax} {  global sphere
  25.  
  26.  
  27.   # let's say they start off at 90 and 2.0
  28.   # we want to go from 90 to 175 and then back down to 90, and from 2 to 1 and back to 2  
  29.   set extent  [expr {$thetaMax - $initialTheta}]
  30.  
  31.   # for the first half, move incrementally closer to thetaMax
  32.   if {$u <= $pauseStart} \
  33.   {  set sphere(thetaMax) [expr {$initialTheta + ((2 * $u) * $extent)}];
  34.   } \
  35.   {  if {$u < $pauseStop } \
  36.      {  set sphere(thetaMax) $thetaMax;
  37.      } \
  38.      {  set sphere(thetaMax) [expr {$initialTheta + ((1 - $u) * 2 * $extent)}];
  39.      } \
  40.   } \
  41.  
  42.   return $u
  43. }
  44.  
  45. proc postBlink {finalTheta} { global  upperLid blink
  46.  
  47.   set upperLid(rotate) $finalTheta
  48.   synchWithScene
  49.   sampleGeneratorIsExecuting $blink(agentName) 0
  50.   return 
  51. }
  52.  
  53.  
  54. set sideToSide(agentName) "sideToSideAgent"
  55. set sideToSide(agentWeight) 1
  56. set sideToSide(howManySeconds) 1
  57. set sideToSide(downU) .4
  58. set sideToSide(upU) .6
  59.  
  60. set sideToSide(min)       0
  61. set sideToSide(max)       1
  62. set sideToSide(duration)  1.5
  63. set sideToSide(varName)  eyeBall(leftRightR)
  64.  
  65. proc preSideToSide {} {  global  scene sideToSide 
  66.  
  67.   if {[set a [string first "(" $sideToSide(varName)]] == -1} \
  68.   {  global $sideToSide(varName) } \
  69.   {  global [string range $sideToSide(varName) 0 [expr {$a - 1}]] }
  70.  
  71.   set sideToSide(howManySteps) [expr {$sideToSide(howManySeconds) * $scene(ticksPerSecond)}]
  72.   set sideToSide(uIncr)  [expr 1.0/[expr {$sideToSide(howManySteps) - 1}]]
  73.   set sideToSide(initial) [set $sideToSide(varName)]
  74.   set sideToSide(u) 0
  75.   set distance [expr {($sideToSide(initial) - $sideToSide(min)) + ($sideToSide(max) - $sideToSide(min)) + ($sideToSide(max) - $sideToSide(initial))}]
  76.   set sideToSide(uA) [expr {($sideToSide(initial) - $sideToSide(min)) / $distance}]
  77.   set sideToSide(uB) [expr {(($sideToSide(initial) - $sideToSide(min)) + (1.0 - $sideToSide(min))) / $distance}]
  78.  
  79.   registerSampleGenerator $sideToSide(agentName) $sideToSide(agentWeight)
  80.   sampleGeneratorIsExecuting $sideToSide(agentName) 1
  81.  
  82.   synchWithScene
  83.   return
  84. }
  85.  
  86. # this behavior goes from the starting point to the maximum left
  87. # point, then to the maximum right point, then returns to the initial
  88. # position
  89. # therefore, there are three parts: 
  90. # - move from initial position to sideToSideMin.
  91. #   note that initialPosition, by definition, is >= sideToSideMin (since sideToSideMin is the lowest it can turn)
  92. # - move from sideToSideMin to sideToSideMax
  93. # - move from sideToSideMax to initialPosition
  94. #   note that initialPosition, by definition, is <= sideToSideMax (since sideToSideMax is the farthest it can turn)
  95.  
  96. proc sideToSideMotorProgram {var u uA uB initial min max agentName} {
  97.  
  98.   if {[set a [string first "(" $var]] == -1} {  global $var } {  global [string range $var 0 [expr {$a - 1}]] }
  99.   if {$u <= $uA} then \
  100.   {  set thisU [expr {$u/$uA}]; setSample $var [expr {lerpDown($thisU, $min, $initial)}] $agentName } \
  101.   elseif {$u <= $uB} \
  102.          {  set thisU [expr {($u-$uA)/($uB-$uA)}]; setSample $var [expr {lerpUp($thisU, $min, $max)}] $agentName } \
  103.          {  set thisU [expr {($u-$uB)/(1.-$uB)}]; setSample $var [expr {lerpDown($thisU, $initial, $max)}] $agentName }
  104.  
  105.   puts "$u: $thisU: $var == [set $var]"
  106.   return $u
  107. }
  108.  
  109.  
  110. proc postSideToSide {finalPosition} {  global sideToSide
  111.  
  112.   if {[set a [string first "(" $sideToSide(varName)]] == -1} \
  113.   {  global $sideToSide(varName) } \
  114.   {  global [string range $sideToSide(varName) 0 [expr {$a - 1}]] }
  115.  
  116.   set [set $sideToSide(varName)] $finalPosition
  117.   synchWithScene
  118.   return 
  119. }
  120.  
  121.  
  122. set dilate(info) "an ephemeral agent"
  123. set dilate(howManySeconds) 1
  124. set dilate(pupilMin) .01
  125. set dilate(pupilMax) .10
  126.  
  127. proc preDilate {} {
  128.  
  129.   global  scene dilate eyeBall
  130.  
  131.  
  132.   set dilate(howManySteps) [expr {$dilate(howManySeconds) * $scene(ticksPerSecond)}]
  133.   set dilate(uIncr)  [expr 1.0/[expr {$dilate(howManySteps) - 1}]]
  134.   set dilate(pupilMin) $eyeBall(pupilSize)
  135.   set dilate(pupilMax) [expr {$eyeBall(irisSize) * .9}]
  136.   set dilate(extent) [expr {$dilate(pupilMax) - $dilate(pupilMin)}]
  137.   set dilate(u) 0
  138.  
  139.   synchWithScene
  140.   return
  141. }
  142.  
  143. proc dilateMotorProgram {u initial extent} {
  144.  
  145.   global eyeBall
  146.  
  147.  
  148.   set eyeBall(pupilSize) [expr {$initial + ($extent * $u)}]
  149.  
  150.   return $u
  151. }
  152.  
  153. proc postDilate {finalPupilSize} { global  eyeBall;
  154.  
  155.   set eyeBall(pupilSize) $finalPupilSize
  156.   synchWithScene
  157.   return 
  158. }
  159.  
  160. set constrict(info) "an ephemeral agent"
  161. set constrict(howManySeconds) 1
  162. set constrict(pupilMin) .01
  163. set constrict(pupilMax) .10
  164.  
  165. proc preConstrict {} {
  166.  
  167.   global  scene constrict eyeBall
  168.  
  169.  
  170.   set constrict(howManySteps) [expr {$constrict(howManySeconds) * $scene(ticksPerSecond)}]
  171.   set constrict(uIncr)  [expr 1.0/[expr {$constrict(howManySteps) - 1}]]
  172.   set constrict(pupilMin) .01
  173.   set constrict(pupilMax) $eyeBall(pupilSize)
  174.   if {$constrict(pupilMax) <= $constrict(pupilMin)} { error "eye already constricted..."} {}
  175.  
  176.   set constrict(extent) [expr {$constrict(pupilMax) - $constrict(pupilMin)}]
  177.   set constrict(u) 0
  178.  
  179.   synchWithScene
  180.   return
  181. }
  182.  
  183. proc constrictMotorProgram {u  max extent} {
  184.  
  185.   global eyeBall
  186.  
  187.  
  188.   set eyeBall(pupilSize) [expr {$max - ($extent * $u)}]
  189.   return $u
  190. }
  191.  
  192. proc postConstrict {finalPupilSize} { global  eyeBall;
  193.  
  194.   set eyeBall(pupilSize) $finalPupilSize
  195.   synchWithScene
  196.   return 
  197. }
  198.  
  199. set goCurrentMinMaxCurrent(varName)    eyeBall(leftRightR)
  200. set goCurrentMinMaxCurrent(agentName)  leftRightR
  201. set goCurrentMinMaxCurrent(agentWeight)  1.0
  202. set goCurrentMinMaxCurrent(min)          0
  203. set goCurrentMinMaxCurrent(max)          1
  204. set goCurrentMinMaxCurrent(duration)     1.5
  205. proc go {} {  global goCurrentMinMaxCurrent
  206.   goCurrentMinMaxCurrent $goCurrentMinMaxCurrent(varName) \
  207.                          $goCurrentMinMaxCurrent(agentName) $goCurrentMinMaxCurrent(agentWeight) \
  208.                          $goCurrentMinMaxCurrent(min) $goCurrentMinMaxCurrent(max) \
  209.                          $goCurrentMinMaxCurrent(duration)
  210. }
  211.  
  212. proc goCurrentMinMaxCurrent {varName agentName agentWeight {min 0} {max 1} {duration 1.5}} {  global scene text
  213.  
  214.   if {[set a [string first "(" $varName]] == -1} {  global $varName } {  global [string range $varName 0 [expr {$a - 1}]] }
  215.  
  216.   set text(line1) "agent: $agentName"
  217.   set text(line2Color) {1 1 1}
  218.   set text(line2) "variable $varName = "
  219.   registerSampleGenerator $agentName $agentWeight
  220.   sampleGeneratorIsExecuting $agentName 1
  221.  
  222.   set initial [set $varName]
  223.   set distance [expr {($initial - $min) + ($max - $min) + ($max - $initial)}]
  224.   set uA [expr {($initial - $min) / $distance}]
  225.   set uB [expr {((($initial - $min) + (1.0 - $min)) / $distance)}]
  226.   set u 0
  227.  
  228.   set text(line2Color) {1 0 0}
  229.   while {$u <= $uA} {
  230.     if {$uA} { set thisU [expr {$u/$uA}] } { set thisU 0}
  231.     setSample $varName [expr {lerpDown($thisU, $min, $initial)}] $agentName
  232.     set text(line2) "A: $varName = [set $varName]"
  233.     set u [expr {$u + (1.0/(($duration * $scene(ticksPerSecond)) - 1) * [synchWithScene])}]
  234.   }
  235.   set text(line2Color) {0 1 0}
  236.   while {$u <= $uB} {
  237.     if {$uA != $uB} { set thisU [expr {($u-$uA)/($uB-$uA)}] } { set thisU 0 }
  238.     setSample $varName [expr {lerpUp($thisU, $min, $max)}] $agentName
  239.     set text(line2) "B: $varName = [set $varName]"
  240.     set u [expr {$u + (1.0/(($duration * $scene(ticksPerSecond)) - 1) * [synchWithScene])}]
  241.   }
  242.   set text(line2Color) {0 0 1}
  243.   while {$u < 1} {
  244.     if {$uB != 1} { set thisU [expr {($u-$uB)/(1-$uB)}] } { set thisU 0 }
  245.     setSample $varName [expr {lerpDown($thisU, $initial, $max)}] $agentName
  246.     set text(line2) "C: $varName = [set $varName]"
  247.     set u [expr {$u + (1.0/(($duration * $scene(ticksPerSecond)) - 1) * [synchWithScene])}]
  248.   }
  249.  
  250.   setSample $varName $initial $agentName
  251.   set text(line1) "agent $agentName is finishing..."
  252.   set text(line2) "C: $varName = [set $varName]"
  253.   synchWithScene
  254.   sampleGeneratorIsExecuting $agentName 0
  255.   set text(line1) ""
  256.   set text(line2Color) {1 1 1}
  257.   set text(line2) ""
  258.   synchWithScene
  259. }
  260.  
  261. set go2CurrentMinMaxCurrent(varName)    eyeBall(leftRightR)
  262. set go2CurrentMinMaxCurrent(agentName)  leftRightR
  263. set go2CurrentMinMaxCurrent(agentWeight)  1.0
  264. set go2CurrentMinMaxCurrent(min)          0
  265. set go2CurrentMinMaxCurrent(max)          1
  266. set go2CurrentMinMaxCurrent(duration)     1.5
  267. proc go2 {} {  global go2CurrentMinMaxCurrent
  268.   go2CurrentMinMaxCurrent $go2CurrentMinMaxCurrent(varName) \
  269.                          $go2CurrentMinMaxCurrent(agentName) $go2CurrentMinMaxCurrent(agentWeight) \
  270.                          $go2CurrentMinMaxCurrent(min) $go2CurrentMinMaxCurrent(max) \
  271.                          $go2CurrentMinMaxCurrent(duration)
  272. }
  273.  
  274. proc doIt {u varName agentName uA uB initial min max} {
  275.  
  276.    if {[set a [string first "(" $varName]] == -1} \
  277.       {  global text $varName } \
  278.       {  global text [string range $varName 0 [expr {$a - 1}]] }
  279.  
  280.   global slider
  281.   set slider(u) $u
  282.   if {$u <= $uA} {
  283.      if {$uA} { set thisU [expr {$u/$uA}] } { set thisU 0}
  284.      set slider(color) "1 0 0"
  285.      setSample $varName [expr {lerpDown($thisU, $min, $initial)}] $agentName
  286.   }  elseif {$u <= $uB} {
  287.             if {$uA != $uB} { set thisU [expr {($u-$uA)/($uB-$uA)}] } { set thisU 0 }
  288.             set slider(color) "0 1 0"
  289.             setSample $varName [expr {lerpUp($thisU, $min, $max)}] $agentName
  290.      } \
  291.      {      if {$uB != 1} { set thisU [expr {($u-$uB)/(1-$uB)}] } { set thisU 0 }
  292.             set slider(color) "0 0 1"
  293.             setSample $varName [expr {lerpDown($thisU, $initial, $max)}] $agentName
  294.      }
  295. }
  296.  
  297.  
  298. proc go2CurrentMinMaxCurrent {varNameList agentName agentWeight minList maxList duration} {  global scene text slider
  299.  
  300.   # sanity check the arguments; are all the lists the same length?
  301.   if {[llength $varNameList] == [llength $minList] \
  302.                              == [llength $maxList] \
  303.                              == [llength $duration]} {} {error "list length mismatch" "argument lists should all be the same length"}
  304.  
  305.   set howMany [llength $varNameList]
  306.  
  307.   # we need to do this to get the initial value(s) of the variable(s) in varList
  308.   for {set i 0} {$i < $howMany} {incr i} {
  309.      set varName [lindex $varNameList $i]
  310.      if {[set a [string first "(" $varName]] == -1} \
  311.         {  global $varName; } \
  312.         {  global [string range $varName 0 [expr {$a - 1}]]; }
  313.   }
  314.  
  315.   set text(line1) "agent: $agentName"
  316.   set text(line2Color) {1 1 1}
  317.   registerSampleGenerator $agentName $agentWeight
  318.   sampleGeneratorIsExecuting $agentName 1
  319.  
  320.   for {set i 0} {$i < $howMany} {incr i} { \
  321.     set initial  [set [lindex $varNameList $i]]
  322.     set min      [lindex $minList $i]
  323.     set max      [lindex $maxList $i]
  324.     set distance [expr {($initial - $min) + ($max - $min) + ($max - $initial)}]
  325.     set uA [expr {($initial - $min) / $distance}]
  326.     set uB [expr {((($initial - $min) + (1.0 - $min)) / $distance)}]
  327.     lappend initialList $initial
  328.     lappend minList $min
  329.     lappend maxList $max
  330.     lappend uAList $uA
  331.     lappend uBList $uB
  332.   }
  333.  
  334.   set u 0
  335.  
  336.   while {$u < 1} {
  337.     for {set i 0} {$i < $howMany} {incr i} {
  338.        set varName [lindex $varNameList $i]
  339.        set initial [lindex $initialList $i]
  340.        set uA [lindex $uAList $i]
  341.        set uB [lindex $uBList $i]
  342.        set min [lindex $minList $i]
  343.        set max [lindex $maxList $i]
  344.        set slider(min) [format %g $min]
  345.        set slider(max) [format %g $max]
  346.        doIt $u $varName $agentName $uA $uB $initial $min $max
  347.     }
  348.     set u [expr {$u + (1.0/(($duration * $scene(ticksPerSecond)) - 1) * [synchWithScene])}]
  349.   }
  350.  
  351.   set text(line1) "agent $agentName is finishing..."
  352.   for {set i 0} {$i < $howMany} {incr i} {
  353.      set varName [lindex $varNameList $i]
  354.      set initial [lindex $initialList $i]
  355.      set uA [lindex $uAList $i]
  356.      set uB [lindex $uBList $i]
  357.      set min [lindex $minList $i]
  358.      set max [lindex $maxList $i]
  359.      doIt 1 $varName $agentName $uA $uB $initial $min $max
  360.   }
  361.   synchWithScene
  362.   sampleGeneratorIsExecuting $agentName 0
  363.   set text(line1) ""
  364.   set text(line2Color) {1 1 1}
  365.   set text(line2) ""
  366.   synchWithScene
  367. }
  368.  
  369. # in this routine, $initial >= $to, so we lerpDown from $initial to $to
  370. proc doDown {u varName agentName initial to} {
  371.  
  372.    if {[set a [string first "(" $varName]] == -1} \
  373.       {  global text $varName } \
  374.       {  global text [string range $varName 0 [expr {$a - 1}]] }
  375.  
  376.   global slider
  377.   set slider(u) $u
  378.   set slider(color) "1 0 0"
  379.   setSample $varName [expr {lerpDown($u, $to, $initial)}] $agentName
  380. }
  381.  
  382. # in this routine, $initial <= $to, so we lerpUp from $initial to $to
  383. proc doUp {u varName agentName initial to} {
  384.  
  385.    if {[set a [string first "(" $varName]] == -1} \
  386.       {  global text $varName } \
  387.       {  global text [string range $varName 0 [expr {$a - 1}]] }
  388.  
  389.   global slider
  390.   set slider(u) $u
  391.   set slider(color) "1 0 0"
  392.   setSample $varName [expr {lerpUp($u, $to, $initial)}] $agentName
  393. }
  394.  
  395. proc goTo {varNameList agentName agentWeight toList duration} {  global scene text slider
  396.  
  397.   # sanity check the arguments; are all the lists the same length?
  398.   if {[llength $varNameList] == [llength $toList] \
  399.                              == [llength $duration]} {} {error "list length mismatch" "argument lists should all be the same length"}
  400.  
  401.   set howMany [llength $varNameList]
  402.  
  403.   # we need to do this to get the initial value(s) of the variable(s) in varList
  404.   for {set i 0} {$i < $howMany} {incr i} {
  405.      set varName [lindex $varNameList $i]
  406.      if {[set a [string first "(" $varName]] == -1} \
  407.         {  global $varName; } \
  408.         {  global [string range $varName 0 [expr {$a - 1}]]; }
  409.   }
  410.  
  411.   set text(line1) "agent: $agentName"
  412.   set text(line2Color) {1 1 1}
  413.   registerSampleGenerator $agentName $agentWeight
  414.   sampleGeneratorIsExecuting $agentName 1
  415.  
  416.   for {set i 0} {$i < $howMany} {incr i} { \
  417.     set initial  [set [lindex $varNameList $i]]
  418.     set to      [lindex $toList $i]
  419.     lappend initialList $initial
  420.     lappend toList $to
  421.   }
  422.  
  423.   set u 0
  424.  
  425.   while {$u < 1} {
  426.     for {set i 0} {$i < $howMany} {incr i} {
  427.        set varName [lindex $varNameList $i]
  428.        set initial [lindex $initialList $i]
  429.        set to [lindex $toList $i]
  430.        if {$initial < $to} { doUp $u $varname $agentName $initial $to } { doDown $u $varname $agentName $initial $to } 
  431.     }
  432.     set u [expr {$u + (1.0/(($duration * $scene(ticksPerSecond)) - 1) * [synchWithScene])}]
  433.   }
  434.  
  435.   set text(line1) "agent $agentName is finishing..."
  436.   for {set i 0} {$i < $howMany} {incr i} {
  437.      set varName [lindex $varNameList $i]
  438.      set initial [lindex $initialList $i]
  439.      set to [lindex n$List $i]
  440.      doIt 1 $varName $agentName $uA $uB $initial $min $max
  441.      if {$initial < $to} { doUp 1 $varname $agentName $initial $to } { doDown 1 $varname $agentName $initial $to } 
  442.   }
  443.   synchWithScene
  444.   sampleGeneratorIsExecuting $agentName 0
  445.   set text(line1) ""
  446.   set text(line2Color) {1 1 1}
  447.   set text(line2) ""
  448.   synchWithScene
  449. }
  450.